在 Kubernetes 中,和 Docker 一樣,有一個重要的機制叫做 Volume,可以避免資料隨著 Container 消失。Kubernetes 提供了多種不同的機制來處理 Volume。
首先,我們可以使用類似 Docker 的 Volume 機制,只是在 Kubernetes 中是透過 YAML 檔案的方式來定義。
# volume-example.yaml
apiVersion: v1
kind: Pod
metadata:
name: ubuntu-pod
spec:
containers:
- name: ubuntu
image: ubuntu:20.04
args:
[
bash,
-c,
'for ((i = 0; ; i++)); do echo "$i: $(date)"; sleep 100; done',
]
volumeMounts:
- mountPath: /volume
name: test-volume # 與下方的名稱對應
volumes:
- name: test-volume # 與上方的名稱對應
hostPath:
path: /data
type: DirectoryOrCreate
這樣就可以將 Volume 連接到 Worker Node 的儲存空間。你可以透過以下指令進到 Pod 中:
kubectl exec -it ubuntu-pod -- bash
接著你可以進到 /volume
中,隨便新增一個檔案,然後就可以在 Worker Node 的 /data
中找到相同的檔案。
不過,上述方式有一個問題,因為 Pod 在哪一個 Worker Node 上運行是由 kube-scheduler 決定的,所以每次的 Node 可能不同。這樣儲存的資料就可能散布在不同的機器上,需要一台一台找,因此,有了另一個更彈性的機制,即 PersistentVolume & PersistentVolumeClaim。
PersistentVolume 中文意思就是持久儲存卷,而 PersistentVolumeClaim 中文意思就是持久儲存卷申請,就是負責跟 PersistentVolume 申請空間放置重要資料。
# pv-pvc-example.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: ubuntu
image: ubuntu:20.04
args:
[
bash,
-c,
'for ((i = 0; ; i++)); do echo "$i: $(date)"; sleep 100; done',
]
volumeMounts:
- mountPath: /volume
name: test-volume
volumes:
- name: test-volume
persistentVolumeClaim:
claimName: local-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-pvc
spec:
accessModes:
- ReadWriteOnce
volumeName: local-pv
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 5Gi
volumeMode: Filesystem
hostPath:
path: "/data"
type: "DirectoryOrCreate"
這樣就可以透過 PersistentVolume & PersistentVolumeClaim 將資料儲存在 Worker Node 上。如果需要查看它們的狀態,可以使用以下指令:
kubectl get persistentvolume
kubectl get persistentvolumeclaim
# 或
kubectl get pv
kubectl get pvc
PersistentVolume 跟 PersistentVolumeClaim 成功連結的話則會顯示 Binding。